/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import modelo.Boleta;

/**
 *
 * @author Felipe
 */
public class BoletaDAO {

    private Connection conexion;

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    public Boleta buscar(int codigo) {
        Boleta registro = null;
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select b.RUT_USUARIO, b.COD_BOLETA, b.DESCUENTO , b.FECHA, b.TOTAL_VENTA, b.ESTADO, u.NOMBRE from ADMINISTRADOR.BOLETA b   join USUARIOS u using (RUT_USUARIO) where COD_BOLETA = ?"; // idx :1
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, codigo);
            System.out.println(sql);
            resultado = sentencia.executeQuery();

            if (resultado.next()) {
                registro = new Boleta();

                registro.setCodBoleta(resultado.getInt("COD_BOLETA"));
                registro.setFecha(resultado.getTimestamp("FECHA"));
                registro.setRutUsuario(resultado.getInt("RUT_USUARIO"));
                registro.setTotalVenta(resultado.getInt("TOTAL_VENTA"));
                registro.setDescuentos(resultado.getInt("DESCUENTO"));
                registro.setEstado(resultado.getBoolean("ESTADO"));
                registro.setNombreUsuario(resultado.getString("NOMBRE"));
                if (registro.getEstado()) {
                    registro.setStrEstado("ACTIVA");
                } else {
                    registro.setStrEstado("NULA");
                }

            }

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("BoletaDAO.buscar: " + codigo, ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }

    public Collection<Boleta> buscarTodos() {
        Collection<Boleta> lista = new ArrayList<Boleta>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select b.COD_BOLETA, b.DESCUENTO , b.FECHA, b.TOTAL_VENTA, b.ESTADO, u.NOMBRE from BOLETA b   join USUARIOS u using (RUT_USUARIO) ORDER BY COD_BOLETA ";
            sentencia = conexion.prepareStatement(sql);
            System.out.println(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Boleta registro = new Boleta();
                    registro.setCodBoleta(resultado.getInt("COD_BOLETA"));
                    registro.setFecha(resultado.getTimestamp("FECHA"));
                    registro.setTotalVenta(resultado.getInt("TOTAL_VENTA"));
                    registro.setDescuentos(resultado.getInt("DESCUENTO"));
                    registro.setEstado(resultado.getBoolean("ESTADO"));
                    registro.setNombreUsuario(resultado.getString("NOMBRE"));
                    if (registro.getEstado()) {
                        registro.setStrEstado("ACTIVA");
                    } else {
                        registro.setStrEstado("NULA");
                    }
                    // finalmente, agregar a la coleccion
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public void Insertar(Boleta bol) {

        PreparedStatement sentencia = null;
        java.sql.Date date = new java.sql.Date(bol.getFecha().getTime());

        try {
            boolean estado = bol.getEstado();
            int codBol = bol.getCodBoleta();
            int rutUsu = bol.getRutUsuario();
            int total = bol.getTotalVenta();
            int desc = bol.getDescuentos();

            String sql = "insert into BOLETA (COD_BOLETA,RUT_USUARIO,FECHA,TOTAL_VENTA,DESCUENTO,ESTADO,DATE) values(?,?,?,?,?,?,?)";
            sentencia = conexion.prepareStatement(sql);

            sentencia.setInt(1, codBol);
            sentencia.setInt(2, rutUsu);
            if (bol.getFecha() == null) {
                sentencia.setTimestamp(3, null);
            } else {
                long fechaEnMilisegundos = bol.getFecha().getTime();
                sentencia.setTimestamp(3, new Timestamp(fechaEnMilisegundos));
            }
            sentencia.setInt(4, total);
            sentencia.setInt(5, desc);
            sentencia.setBoolean(6, estado);
            sentencia.setDate(7, date);
            sentencia.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al insertar boleta", ex);

        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }

    void anular(int codigo) {
        PreparedStatement sentencia = null;
        try {

            String sql = "UPDATE BOLETA SET ESTADO = ? WHERE  COD_BOLETA = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setBoolean(1, false);
            sentencia.setInt(2, codigo);
            sentencia.executeUpdate();

        } catch (SQLException ex) {

        }
    }

    int getCodBol() {
        PreparedStatement sentencia = null;
        int codigo = 0;
        ResultSet resultado = null;
        try {
            String sql = "SELECT MAX(COD_BOLETA) AS CODIGO FROM BOLETA";
            sentencia = conexion.prepareStatement(sql);

            resultado = sentencia.executeQuery();
            if (resultado.next()) {
                codigo = (resultado.getInt("CODIGO") + 1);

            }

        } catch (SQLException ex) {

        }
        return codigo;
    }

    Collection<Boleta> buscarEntreFechas(Date fechita, Date fecha) {

        Collection<Boleta> lista = new ArrayList<Boleta>();
        Calendar cale = Calendar.getInstance();
        cale.setTime(fechita);
        cale.set(Calendar.HOUR_OF_DAY, 00);
        cale.set(Calendar.MINUTE, 00);
        cale.set(Calendar.SECOND, 01);
        cale.set(Calendar.MILLISECOND, 00);
        Date fechaIni = cale.getTime();
        cale.setTime(fecha);
        cale.set(Calendar.HOUR_OF_DAY, 23);
        cale.set(Calendar.MINUTE, 59);
        cale.set(Calendar.SECOND, 59);
        cale.set(Calendar.MILLISECOND, 999);
        Date fechaFin = cale.getTime();
        java.sql.Date sqlIni = new java.sql.Date(fechaIni.getTime());
        java.sql.Date sqlFin = new java.sql.Date(fechaFin.getTime());

        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = " select b.COD_BOLETA, b.DESCUENTO , b.FECHA, b.TOTAL_VENTA, b.ESTADO, u.NOMBRE from ADMINISTRADOR.BOLETA b   join USUARIOS u using (RUT_USUARIO)  where DATE between ? and ? ORDER BY COD_BOLETA";
            sentencia = conexion.prepareStatement(sql);

            sentencia.setDate(1, sqlIni);
            sentencia.setDate(2, sqlFin);
            //      sentencia.setTimestamp(2, new Timestamp(fechaFin.getTime()));

            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Boleta registro = new Boleta();
                    registro.setCodBoleta(resultado.getInt("COD_BOLETA"));
                    registro.setFecha(resultado.getTimestamp("FECHA"));
                    registro.setTotalVenta(resultado.getInt("TOTAL_VENTA"));
                    registro.setDescuentos(resultado.getInt("DESCUENTO"));
                    registro.setEstado(resultado.getBoolean("ESTADO"));
                    registro.setNombreUsuario(resultado.getString("NOMBRE"));
                    if (registro.getEstado()) {
                        registro.setStrEstado("ACTIVA");
                    } else {
                        registro.setStrEstado("NULA");
                    }
                    // finalmente, agregar a la coleccion
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    Collection<Boleta> buscarPorRut(int rut) {
        Collection<Boleta> lista = new ArrayList<Boleta>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;

        try {
            String sql = "select b.COD_BOLETA, b.DESCUENTO , b.FECHA, b.TOTAL_VENTA, b.ESTADO, u.NOMBRE from ADMINISTRADOR.BOLETA b   join USUARIOS u using (RUT_USUARIO) where RUT_USUARIO = ? ORDER BY COD_BOLETA ";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, rut);
            System.out.println(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Boleta registro = new Boleta();
                    registro.setCodBoleta(resultado.getInt("COD_BOLETA"));
                    registro.setFecha(resultado.getTimestamp("FECHA"));
                    registro.setTotalVenta(resultado.getInt("TOTAL_VENTA"));
                    registro.setDescuentos(resultado.getInt("DESCUENTO"));
                    registro.setEstado(resultado.getBoolean("ESTADO"));
                    registro.setNombreUsuario(resultado.getString("NOMBRE"));
                    if (registro.getEstado()) {
                        registro.setStrEstado("ACTIVA");
                    } else {
                        registro.setStrEstado("NULA");
                    }

                    // finalmente, agregar a la coleccion
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

}
